package me.mingshan.leetcode;

/**
 * https://leetcode.cn/problems/compare-version-numbers/description/
 *
 *
 * 给你两个 版本号字符串 version1 和 version2 ，请你比较它们。版本号由被点 '.' 分开的修订号组成。修订号的值 是它 转换为整数 并忽略前导零。
 *
 * 比较版本号时，请按 从左到右的顺序 依次比较它们的修订号。如果其中一个版本字符串的修订号较少，则将缺失的修订号视为 0。
 *
 * 返回规则如下：
 *
 * 如果 version1 < version2 返回 -1，
 * 如果 version1 > version2 返回 1，
 * 除此之外返回 0。
 *
 *
 * 示例 1：
 *
 * 输入：version1 = "1.2", version2 = "1.10"
 *
 * 输出：-1
 *
 * 解释：
 *
 * version1 的第二个修订号为 "2"，version2 的第二个修订号为 "10"：2 < 10，所以 version1 < version2。
 *
 * 示例 2：
 *
 * 输入：version1 = "1.01", version2 = "1.001"
 *
 * 输出：0
 *
 * 解释：
 *
 * 忽略前导零，"01" 和 "001" 都代表相同的整数 "1"。
 *
 * 示例 3：
 *
 * 输入：version1 = "1.0", version2 = "1.0.0.0"
 *
 * 输出：0
 *
 * 解释：
 *
 * version1 有更少的修订号，每个缺失的修订号按 "0" 处理。
 *
 * @author hanjuntao
 * @date 2025/7/24 0024
 */
public class L_165_compare_version_numbers {

    public static void main(String[] args) {
        System.out.println(compareVersion2("1.01", "1.001"));// 0

        System.out.println(compareVersion2("1.0", "1.0.0.0")); // 0

        System.out.println(compareVersion2("1.2", "1.10")); // -1

        System.out.println(compareVersion2("7.5.2.4", "7.5.3"));
    }

    /**
     * 思路:
     *
     * 1. 将两个字符串根据。拆分成数组
     * 2. 按照顺序依次遍历数组，比较两个数组的元素
     * 3. 如果两个元素相等，继续比较下一个元素
     * 4，特殊场景：如果两个数组的长度不相等，则将短的数组不足的部分默认为0
     *
     * @param version1
     * @param version2
     * @return
     */
    public static int compareVersion(String version1, String version2) {
        String[] v1 = version1.split("\\.");
        String[] v2 = version2.split("\\.");

        // 短的数组补0
        if (v1.length > v2.length) {
            String[] newV2 = new String[v1.length];
            for (int i = 0; i < v1.length; i++) {
                newV2[i] = i < v2.length ? v2[i] : "0";
            }
            v2 = newV2;
        } else if (v1.length < v2.length) {
            String[] newV1 = new String[v2.length];
            for (int i = 0; i < v2.length; i++) {
                newV1[i] = i < v1.length ? v1[i] : "0";
            }
            v1 = newV1;
        }

        // 逐个比较
        for (int i = 0; i < v1.length; i++) {
            int v1Int = Integer.parseInt(v1[i]);
            int v2Int = Integer.parseInt(v2[i]);
            if (v1Int > v2Int) {
                return 1;
            } else if (v1Int < v2Int) {
                return -1;
            }
        }

        return 0;
    }

    /**
     * 思路:
     *
     * 不额外使用空间，双指针
     *
     * @param version1
     * @param version2
     * @return
     */
    public static int compareVersion2(String version1, String version2) {
        int l1 = version1.length();
        int l2 = version2.length();

        int s1 = 0;
        int s2 = 0;

        // 判断是否到达末尾
        while (s1 < l1 || s2 < l2) {
            // 获取版本1的数字
            String temp1 = "";
            // 如果超过边界，则默认为0
            if (s1 > l1 - 1) {
                temp1 = "0";
                s1++;
            } else {
                while (s1 < l1 && version1.charAt(s1) != '.') {
                    temp1 += version1.charAt(s1);
                    s1++;
                }

                // 跳过点
                s1++;
            }

            // 获取版本2的数字
            String temp2 = "";
            // 如果超过边界，则默认为0
            if (s2 > l2 - 1) {
                temp2 = "0";
                s2++;
            } else {
                while (s2 < l2 && version2.charAt(s2) != '.') {
                    temp2 += version2.charAt(s2);
                    s2++;
                }

                // 跳过点
                s2++;
            }

            int v1Int = Integer.parseInt(temp1);
            int v2Int = Integer.parseInt(temp2);
            if (v1Int > v2Int) {
                return 1;
            } else if (v1Int < v2Int) {
                return -1;
            }
        }

        return 0;
    }
}
